<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN" xml:lang="zh_CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="../rurple.css" type="text/css" />

<title>神奇的解决方案-复习一</title>
</head>
<body>
<a name="amazing" id="amazing"></a>
<h2 class="title">17. 神奇的解决方案-复习一</h2>

<p>在这堂课中，我们要写一段完整的程序，目的是降低程序的复杂度，把程序变得容易阅读。</p>

<!--===================================================-->
<hr class="line" />

<h3 class="section">准备好了？</h3>

<p>首先，我们来考虑一个简单的问题：让乐跑环绕他的世界的边走一圈，假设一路上没有任何障碍物（墙壁）。 在外面引入<tt>front_is_clear()</tt>时，我们其实曾经做过这样的练习。假设乐跑一开始就携带了至少一个报警器，如下列出了解决问题方法的大纲：</p>

<pre>
1. 放下一个报警器来标志乐跑的起点
2. 保持前进直到遇到一面墙
3. 遇到墙时左转
4. 重复步骤2 和3 直到我们发现已经放下的那个报警器
5. 发现报警器时停止程序（关机）
</pre>

<p>关键步骤是第四步，那里我们使用了一个重复的命理。 这个命令可以这样写：</p>

<pre>
<span class="keyword">while not</span> on_beeper():
</pre>

<p>步骤2和3应该紧随其后，现在我们一起来用合适的命令来写下整个方案吧：</p>

<pre>
put_beeper()
<span class="keyword">while not</span> on_beeper():
    <span class="keyword">if</span> front_is_clear():
        move()
    <span class="keyword">else</span>:
        turn_left()

turn_off()
</pre>

<p>如果开始位置是如下所示的情况，根据上述的程序，乐跑机器人会怎么做呢？</p>

<p><img alt="around the world: start" src=
"../../images/intro/around1start.png" /></p>

<p>我们不会得到我们想要的结果，实际我们想要的情况应该如下： 你知道为什么吗？ 还没明白的话，回头看看程序再思考一下吧。</p>

<p><img alt="around the world: start" src=
"../../images/intro/around1end.png" /></p>

<div class="lessons_nav">
<a href="16-while.htm"><img alt="previous" src=
"../../images/previous.png" />暂时</a> - 
<a href="../lessons_toc.htm"><img alt=
"home" src="../../images/home.png" /></a> - <a href="18-amazing2.htm">神奇的解决方案-复习二<img alt="next" src="../../images/next.png" /></a>
</div>
</body>
</html>
